package com.buddy.learn.algorithm.demo;

/**
 * @author Buddy
 * @date 2021/5/6
 */
public class _024合唱队 {
    /**
     * 计算最少出列多少位同学，使得剩下的同学排成合唱队形
     * 说明：
     * N位同学站成一排，音乐老师要请其中的(N-K)位同学出列，使得剩下的K位同学排成合唱队形。
     * 合唱队形是指这样的一种队形：
     * 设K位同学从左到右依次编号为1，2…，K，他们的身高分别为T1，T2，…，TK，
     * 则他们的身高满足存在i（1<=i<=K）使得T1<T2<......<Ti-1<Ti>Ti+1>......>TK。
     * 你的任务是，已知所有N位同学的身高，计算最少需要几位同学出列，可以使得剩下的同学排成合唱队形。
     * 注意不允许改变队列元素的先后顺序
     * 请注意处理多组输入输出！
     * 输入：
     * 8
     * 186 186 150 200 160 130 197 200
     * 输出：
     * 4
     *
     *
     * 分析：
     *  学生战队的位置是不变的。
     *  合唱排序顺序：矮 - 高 -矮
     *      左边比自己矮的+自己：
     *      右边比自己矮的排序，高->低
     *  左边：最长上升子序LIS问题
     *  选出最长站队
     */
    public static void main(String[] args) {
//        Scanner scan = new Scanner(System.in);
//        while(scan.hasNext()){
//            int total = scan.nextInt();
//            int[] arr = new int[total+1];
//            for(int i = 1 ; i <= total ; i++){
//                arr[i] = scan.nextInt();
//            }
        int total = 8;
        int[] arr = {186, 186, 150, 200, 160, 130, 197, 200};
        int[] l = left(arr);
        int[] r = right(arr);
        int max = 0;
        for (int i = 0; i < arr.length; i++) {
            if (max < (l[i] + r[i] - 1)) {
                max = l[i] + r[i] - 1;
            }
        }
        System.out.println(total - max);

//        }
    }

    private static int[] left(int[] arr) {
        int[] left = new int[arr.length];
        for (int i = 1; i < arr.length; i++) {
            left[i] = 1;
            for (int j = 1; j < i; j++) {
                if (arr[j] < arr[i]) {
                    left[i] = Math.max(left[i], left[j] + 1);
                }
            }
        }
        return left;
    }


    private static int[] right(int[] arr) {
        int[] right = new int[arr.length];
        for (int i = arr.length - 1; i > 0; i--) {
            right[i] = 1;
            for (int j = arr.length - 1; j > i; j--) {
                if (arr[j] < arr[i]) {
                    right[i] = Math.max(right[i], right[j] + 1);
                }
            }
        }
        return right;
    }
}
